package main;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Person {
    /**
     * 示例9
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        //通过反射加载Person类
        Class clz = Class.forName("entity.Person");

        //根据方法名和参数列表获取static final int getAge()方法
        //没有参数可以不屑或用null表示
        Method getAge = clz.getDeclaredMethod("getAge",null);
        //getAge方法为default(package),这里已超出其访问范围,不能直接访问
        //通过setAccessable方法,设定为可以访问
        getAge.setAccessible(true);
        //调用getAge 方法并传参,没有参数可以不屑或用null表示
        //getAge方法为静态方法,调用时可以不指定具体Person实例
        Object returnAge = getAge.invoke(null,null);
        System.out.println("年龄是:"+returnAge);

        Object person = clz.newInstance(); //创建Person实例

        //根据方法名和参数列表获取private void silentMethod()方法,
        //没有参数可以不写或用途null表示
        Method slientMethod = clz.getDeclaredMethod("silentMethod",null);
        slientMethod.setAccessible(true);
        slientMethod.invoke(person,null);
        Method setName = clz.getDeclaredMethod("setName", String.class);
        setName.invoke(person,"New Person");
        Object returnName = clz.getDeclaredMethod("getName").invoke(person);
        System.out.println("刚才设定的name是:"+returnName);
    }
}
